home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / 342_01.zip / I8255F04.C < prev    next >
C/C++ Source or Header  |  1993-04-03  |  3KB  |  99 lines

  1. /*-
  2.  *  ----------------------------------------------------------------------
  3.  *  File        :   I8255F04.C
  4.  *  Creator     :   Blake Miller
  5.  *  Version     :   01.00.00        February 1991
  6.  *  Language    :   Microsoft C     Version 5.1
  7.  *  Purpose     :   Intel 8255 Compatible Digital IO Functions
  8.  *              :   Bit Get Function
  9.  *  ----------------------------------------------------------------------
  10.  */
  11.  
  12. #define  I8255F04_C_DEFINED  1
  13. #include "I8255FN.H"
  14. #undef   I8255F04_C_DEFINED
  15.  
  16. void I8255_bitget (I8255DAT *data, int bit, int *state);
  17.  
  18. /*- I8255 : Bit Get --------------------------**
  19.  *  Read one of the bits in the 8255.
  20.  *  A state of 1 indicates a set bit and a state of 0
  21.  *  indicates a clear bit.
  22.  *  The bit number should be from 1 - 24 as follows:
  23.  *   1 = Port A Bit 0;   8 = Port A Bit 7
  24.  *   9 = Port B Bit 0;  16 = Port B Bit 7
  25.  *  17 = Port C Bit 0;  24 = Port C Bit 7
  26.  *  Passed:
  27.  *      pointer :   I8255DAT
  28.  *      integer :   bit number
  29.  *      pointer :   integer :   state : 1 = SET, 0 = CLEAR
  30.  *  Returns:
  31.  *      nothing
  32.  *      Loads stat with approrpiate error code.
  33.  *      Loads state with 0 or 1.
  34.  */
  35. void I8255_bitget (I8255DAT *data, int bit, int *state)
  36.     {
  37.     int             port;   /* port number  */
  38.     int             padd;   /* port address */
  39.     unsigned char   ival;   /* in value     */
  40.  
  41.     /*  Make sure the bit requested is valid.
  42.      *  Three ports of 8 bits each = 24 bits.
  43.      */
  44.     if ( (bit < 1) || (bit > 24) ){
  45.         data->stat = I8255_ST_BB;
  46.         return;
  47.         }
  48.  
  49.     /*  Decrement the bit so we have zero offset.
  50.      *  This is useful for lining up the port with integer
  51.      *  divide and it is also used for left shifting to
  52.      *  create a mask.
  53.      *  Get port number by doing integer division.  The port
  54.      *  number should end up as 0, 1, or 2, corresponding to
  55.      *  PORT A, PORT B, and PORT C respectively.
  56.      *  Then do modulo 8 to get the corrsponding bit
  57.      *  number to be used in the particular byte.  This
  58.      *  value will end up being 0 - 7.
  59.      */
  60.     bit--;
  61.     port = ( bit / 8);      /* port number (0 - 2)          */
  62.     bit = bit % 8;          /* modulo to get the bit number */
  63.  
  64.     /*  Input data:
  65.      *  Obtain port address.
  66.      */
  67.     switch ( port ){
  68.         case 0:         /* port A   */
  69.             padd = I8255_PORTA(data->base);
  70.             break;
  71.         case 1:         /* port B   */
  72.             padd = I8255_PORTB(data->base);
  73.             break;
  74.         case 2:         /* port C   */
  75.             padd = I8255_PORTC(data->base);
  76.             break;
  77.         default:        /* bad port number  */
  78.             data->stat = I8255_ST_BP;
  79.             return;
  80.             break;
  81.         }
  82.  
  83.     chp_portrd ( padd, &ival );     /* read in byte     */
  84.  
  85.     /*  Right shift data to line it up with the proper bit.
  86.      */
  87.     ival = ival >> bit;             /* left shift input data        */
  88.     ival = ival & 0x01;             /* mask out upper bits          */
  89.     *state = (unsigned int) ival;   /* load value                   */
  90.  
  91.     data->stat = I8255_ST_OK;
  92.     }
  93.  
  94. /*-
  95.  *  ----------------------------------------------------------------------
  96.  *  END I8255F04.C Source File
  97.  *  ----------------------------------------------------------------------
  98.  */
  99.